package goods_ctrl

import (
	"net/http"
	"ubt-aio-service/app/mod/goods_mod"
	"ubt-aio-service/app/mod/sys_mod"
	"ubt-aio-service/app/pkg/code"
	"ubt-aio-service/app/pkg/parse"
	"ubt-aio-service/app/serv/goods_serv"
	"ubt-aio-service/app/serv/sys_serv"
	"ubt-aio-service/app/utils"
)

type goodsType struct{}

var TypeCtrl goodsType

// Save 保存
func (c *goodsType) Save(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	userId := userInfo.UserId
	req := &goods_mod.TypeSaveReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(r, req); err != "" {
		utils.ToJson(w, &utils.ResJson{Code: utils.ParamErr.Code, Msg: err})
		return
	}
	// 过滤关键参数值中的非法字符
	req.TypeId = utils.InputFilter(req.TypeId, true)
	req.TypeName = utils.InputFilter(req.TypeName, false)
	req.TypeCode = utils.InputFilter(req.TypeCode, true)
	// 判断编码是否重复
	extVo := &goods_mod.TypeExtVo{TypeCode: req.TypeCode, TypeId: req.TypeId}
	if ext := goods_serv.TypeServ.Exists(extVo); ext {
		utils.ToJson(w, utils.Exists)
		return
	}
	var (
		res  *utils.ResJson
		kind uint8
	)
	if req.TypeId == "" {
		// 新增
		req.TypeId = code.NewNanoid(21)
		res = goods_serv.TypeServ.Add(req)
		kind = 1
	} else {
		// 修改
		res = goods_serv.TypeServ.Update(req)
		kind = 3
	}
	if res.Code == utils.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userId, MenuCode: utils.GoodsType, IpAddr: userInfo.ClientIp, Kind: kind}
		sys_serv.SysLogServ.Add(logReq)
	}
	utils.ToJson(w, res)
}

// Process 处理
func (c *goodsType) Process(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	req := &goods_mod.TypeProcReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(r, req); err != "" {
		utils.ToJson(w, &utils.ResJson{Code: utils.ParamErr.Code, Msg: err})
		return
	}
	// 过滤关键参数值中的非法字符
	req.Ids = utils.InputFilter(req.Ids, true)
	res := goods_serv.TypeServ.Process(req)
	if res.Code == utils.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: utils.GoodsType, IpAddr: userInfo.ClientIp, Kind: 2}
		sys_serv.SysLogServ.Add(logReq)
	}
	utils.ToJson(w, res)
}

// One 获取详情
func (c *goodsType) One(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	typeId := u.Get("typeId")
	// 过滤关键参数值中的非法字符
	typeId = utils.InputFilter(typeId, true)
	if typeId == "" || len(typeId) != 21 {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	res := goods_serv.TypeServ.One(typeId)
	utils.ToJson(w, res)
}

// List 获取菜单树状列表
func (c *goodsType) List(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	kinds := u.Get("kind")
	// 过滤关键参数值中的非法字符
	kinds = utils.InputFilter(kinds, true)
	kind := parse.Str2u8(kinds)
	res := goods_serv.TypeServ.List(kind)
	utils.ToJson(w, res)
}

// Tree 获取菜单树状列表
func (c *goodsType) Tree(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	kinds := u.Get("kind")
	// 过滤关键参数值中的非法字符
	kinds = utils.InputFilter(kinds, true)
	kind := parse.Str2u8(kinds)
	res := goods_serv.TypeServ.Tree(kind)
	utils.ToJson(w, res)
}

// Sort 获取菜单数量，用于排序
func (c *goodsType) Sort(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	kinds := u.Get("kind")
	parentId := u.Get("parentId")
	// 过滤关键参数值中的非法字符
	kinds = utils.InputFilter(kinds, true)
	parentId = utils.InputFilter(parentId, true)
	kind := parse.Str2u8(kinds)
	if parentId == "" || len(parentId) != 21 {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	res := goods_serv.TypeServ.Sort(kind, parentId)
	utils.ToJson(w, res)
}

// Select 获取当前级别分类选择列表
func (c *goodsType) Select(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	kinds := u.Get("kind")
	parentId := u.Get("parentId")
	// 过滤关键参数值中的非法字符
	kinds = utils.InputFilter(kinds, true)
	parentId = utils.InputFilter(parentId, true)
	kind := parse.Str2u8(kinds)
	res := goods_serv.TypeServ.Select(kind, parentId)
	utils.ToJson(w, res)
}
